<?php

namespace tch\core;

/**
 * 类自动加载
 * @package tch.core
 */
class Autoloader
{

    private $dir;
    private $pluginId;

    /**
     * 构造函数
     * @param string $dir 手动指定起始目录 默认 DISCUZ_ROOT/source/plugin
     */
    public function __construct($dir = null)
    {
        $this->pluginId = defined('TCH_APP_ID') ? TCH_APP_ID : TCH_CORE_ID;
        
        if (is_null($dir)) {
            $dir = dirname(dirname(dirname(__FILE__)));
        }
        $this->dir = $dir;
    }

    /**
     * 向PHP注册SPL autoloader
     * @param string $pluginId 
     * @param string $dir
     */
    public static function register($pluginId = null, $dir = null)
    {
        ini_set('unserialize_callback_func', 'spl_autoload_call');

        spl_autoload_register(array(new self($pluginId, $dir), 'autoload'), FALSE, TRUE);
    }

    /**
     * 系统自动注册
     * 
     * 插件标识 tch_core abc_xxxx,将下划线之前的部分视为vendor（团队标识）之后的部分视为模块名,类名tch\core\Model, abc\xxx\Model等
     * 
     * 目录名及文件名一律小写,每个插件下,有一个class目录
     *
     * @param string $class 类名
     *
     * @return boolean 正常加载返回true
     */
    public function autoload($class)
    {
        if (class_exists($class, false)) {
            return true;
        }
        
        if(false === strpos($class, '\\')) {
            return false;
        }
        
        $file = substr_replace($class, '_', strpos($class, '\\'), 1);
        $segments = explode('\\', $file, 2);
        if (count($segments) < 2) {
            return false;
        }
        
        $file = $this->dir . '/' . str_replace('\\', '/', strtolower($segments[0] . '/class/' . $segments[1])) . '.php';
        if (file_exists($file)) {
            require_once $file;

            return true;
        }

        return false;
    }

}
